package progress.exa2;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class InputStreamStudy {

    public static void main(String[] args) throws IOException {
        //readStudy();
//        readByteStudy();
//        readByteLengthStudy();
        //skipStudy();
        //availableStudy();
        markStudy();
    }

    /**
     * FileInputStream实例
     * @throws IOException
     */
    public static void readStudy() throws IOException {
        InputStream inputStream = new FileInputStream("麻子.txt");
        int n;
        while ((n=inputStream.read())!=-1){
            System.out.print((char)n);
        }
    }

    public static void readByteStudy() throws IOException {
        InputStream inputStream = new FileInputStream("麻子.txt");
        byte[] a = new byte[1000];
        System.out.println(inputStream.read(a));
        for (byte n:a){
            System.out.print((char)n);
        }
    }

    public static void readByteLengthStudy() throws IOException {
        InputStream inputStream = new FileInputStream("麻子.txt");
        byte[] a = new byte[1000];
        System.out.println("实际读到的字节数为："+inputStream.read(a,100,100));
        for (byte n:a){
            System.out.print((char)n);
        }
    }

    /**
     * skip可以跳过源中一定数量的字节
     * @throws IOException
     */
    public static void skipStudy() throws IOException {
        InputStream inputStream = new FileInputStream("麻子.txt");
        System.out.println("跳过前100个字节： "+inputStream.skip(100));
        int n;
        while ((n=inputStream.read())!=-1){
            System.out.print((char)n);
        }

    }

    /**
     * available可以预估剩余未读取的字节估计数
     * @throws IOException
     */
    public static void availableStudy() throws IOException {
        InputStream inputStream = new FileInputStream("麻子.txt");
        int n = 100;
        int ch;
        while ((ch=inputStream.read())!=-1&&n>0){
            n--;
            System.out.print((char)ch);
        }
        System.out.println("还剩的未读的字节数："+ inputStream.available());
    }

    /**
     * mark在JAVA中的实现是和缓冲区相关的。只要缓冲区够大，mark后读取的数据没有超出缓冲区的大小，mark标记就不会失效。
     * 如果不够大，mark后又读取了大量的数据，导致缓冲区更新，原来标记的位置自然找不到了。
     * 因此，mark后读取多少字节才失效，并不完全由readlimit参数确定，也和BufferedInputStream类的缓冲区大小有关。
     * 如果BufferedInputStream类的缓冲区大小大于readlimit，在mark以后只有读取超过缓冲区大小的数据，mark标记才会失效。
     * @throws IOException
     */
    public static void markStudy() throws IOException {
        InputStream inputStream = new BufferedInputStream(new FileInputStream("麻子.txt"),100);
        int n;
        // 这里100可以重置, 101却重置失败
        int num = 100;
        //这里的readLimit和实际情况相关，
        // 如果BufferedInputStream类的缓冲区大小大于readlimit，在mark以后只有读取超过缓冲区大小的数据，mark标记才会失效。
        inputStream.mark(10);
        while ((n=inputStream.read())!=-1&&num>1){
            num--;
            System.out.print((char) n);
        }
        inputStream.reset();
        System.out.println();
        System.out.println("调用reset 重新读取");
        while ((n=inputStream.read())!=-1){
            System.out.print((char)n);
        }
    }

    /**
     * 在InputStream中，此方法是个钩子，共其实现子类实现，
     * 如果支持mark则将其实现为true
     */
    public static void markSupported(){

    }



}
